package com.yuelao.yuelao_backend.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yuelao.yuelao_backend.dto.CoinTransactionDTO;
import com.yuelao.yuelao_backend.entity.CoinTransaction;

import java.util.List;
import java.util.Map;

/**
 * 爱心币Service
 * 重构说明：适配新的UserCoinAccount + CoinTransaction表结构，金额使用Integer（以分为单位）
 */
public interface CoinService extends IService<CoinTransaction> {

    /**
     * 获取爱心币余额和等级
     * @param userId 用户ID
     * @return 余额和等级信息
     */
    Map<String, Object> getCoinBalance(Long userId);

    /**
     * 获取交易记录
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @param type 交易类型，可选'earn', 'spend', 'transfer_in', 'transfer_out'
     * @return 交易记录列表
     */
    List<CoinTransactionDTO> getTransactionHistory(Long userId, int pageNum, int pageSize, String type);

    /**
     * 消费爱心币
     * @param userId 用户ID
     * @param amount 消费金额（以分为单位）
     * @param source 来源
     * @param title 标题
     * @param description 交易描述
     * @param relatedId 关联ID
     * @param relatedType 关联类型
     * @return 是否成功
     */
    boolean spendCoins(Long userId, Integer amount, String source, String title, 
                      String description, Long relatedId, String relatedType);

    /**
     * 增加爱心币
     * @param userId 用户ID
     * @param amount 增加金额（以分为单位）
     * @param source 来源
     * @param title 标题
     * @param description 交易描述
     * @param relatedId 关联ID
     * @param relatedType 关联类型
     * @return 是否成功
     */
    boolean addCoins(Long userId, Integer amount, String source, String title, 
                    String description, Long relatedId, String relatedType);

    /**
     * 转账爱心币
     * @param fromUserId 转出用户ID
     * @param toUserId 转入用户ID
     * @param amount 转账金额（以分为单位）
     * @param remark 转账留言
     * @return 是否成功
     */
    boolean transferCoins(Long fromUserId, Long toUserId, Integer amount, String remark);

    /**
     * 将 CoinTransaction 实体转换为 CoinTransactionDTO
     * @param transaction CoinTransaction 实体
     * @return CoinTransactionDTO
     */
    CoinTransactionDTO convertToCoinTransactionDTO(CoinTransaction transaction);

    /**
     * 升级爱心币等级
     * @param userId 用户ID
     * @return 升级结果
     */
    Map<String, Object> upgradeLevel(Long userId);
}